package com.example.tplus.controller;

import com.example.tplus.bean.*;
import com.example.tplus.mapper.BaoGongMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

@Controller
public class WanShengBaoGongController {
    @Autowired
    BaoGongMapper baoGongMapper;

    Logger logger = LoggerFactory.getLogger(getClass());

    @ResponseBody
    @RequestMapping(value = "getTime", method = RequestMethod.GET)
    public HttpData<String> getTime() {
        System.out.println("gettime");
        HttpData<String> httpData = new HttpData<>();
        httpData.setCode(0);
        httpData.setData(System.currentTimeMillis() + "");
        return httpData;
    }

    @ResponseBody
    @RequestMapping(value = "longin", method = RequestMethod.GET)
    public HttpData<User> getUser(@RequestParam(value = "id") String id) {
        HttpData<User> httpData = new HttpData<>();
        if (baoGongMapper.getUser(id) != null) {
            User user = baoGongMapper.getUser(id);
            //System.out.println(user.toString());
            httpData.setCode(0);
            httpData.setMsg("登录成功");
            httpData.setData(user);
        } else {
            httpData.setCode(0);
            httpData.setMsg("没有该用户信息");
        }
        logger.info("longin-------" + id + "::" + httpData.getMessage());
        return httpData;
    }

    @ResponseBody
    @RequestMapping(value = "getGX")
    public HttpData<BaoGong> getBaoGong(@RequestBody QueryBaoGongBean queryBaoGongBean) {
        //System.out.println("queryBaoGongBean---" + queryBaoGongBean.toString());
        logger.info("queryBaoGongBean:" + queryBaoGongBean.toString());
        HttpData<BaoGong> httpData = new HttpData<>();
        BaoGong baoGong = new BaoGong();

        //获取工序名
        if (baoGongMapper.getGXName(queryBaoGongBean) != null) {
            baoGong.set工序名称(baoGongMapper.getGXName(queryBaoGongBean).get工序名称().trim());
            baoGong.set工序编号(baoGongMapper.getGXName(queryBaoGongBean).get工序编号().trim());
        } else {
            baoGong.set工序编号("");
            baoGong.set工序名称("");
        }
        //判断是否为测试，外观检查，成品检查，如果成立则不可手持机报工
        if (baoGong.get工序名称().equals("测试") || baoGong.get工序名称().equals("外观检查") || baoGong.get工序名称().equals("成品检验")) {
            httpData.setCode(1);
            httpData.setMsg("测试,外观检查,成品检验等工序不可以在手持上报工请在pc端报工");
            return httpData;
        } else {
            if (baoGongMapper.isContainGXNumer(queryBaoGongBean, baoGong.get工序编号()) != null && baoGongMapper.isContainGXNumer(queryBaoGongBean, baoGong.get工序编号()).size() > 0) {
                //查询物料编号
                if (baoGongMapper.get物料编号(queryBaoGongBean) != null) {
                    baoGong.set物料编号(baoGongMapper.get物料编号(queryBaoGongBean).get(0));
                } else {
                    baoGong.set物料编号("");
                }
                //查询加工顺序
                if (baoGongMapper.Get加工顺序(baoGong.get工序编号(), baoGong.get物料编号()) != null) {
                    baoGong.set加工顺序(baoGongMapper.Get加工顺序(baoGong.get工序编号(), baoGong.get物料编号()));
                }
                //查询工序单价
                baoGong.set工序单价(baoGongMapper.getPrice(queryBaoGongBean, baoGong.get加工顺序()));
                //查询订单数量
                baoGong.set订单数量(baoGongMapper.get本工序订单数量(queryBaoGongBean, baoGong.get物料编号()).get(0));

                //最大可报数量为如果是首道工序，则不能超过订单数量。如果非首道工序则不能超过上道工序累计值（合格数量）
                //查询上道工序
                if (baoGongMapper.get上一道工序(queryBaoGongBean, baoGong.get加工顺序()) != null && !baoGongMapper.get上一道工序(queryBaoGongBean, baoGong.get加工顺序()).equals("") && baoGongMapper.get上一道工序(queryBaoGongBean, baoGong.get加工顺序()) != "") {
                    String 上一道工序 = baoGongMapper.get上一道工序(queryBaoGongBean, baoGong.get加工顺序());
                    if (!上一道工序.trim().equals("") && 上一道工序.trim() != "") {
                        if (baoGongMapper.get上一道工序报工数量(queryBaoGongBean, 上一道工序) != null && baoGongMapper.get上一道工序报工数量(queryBaoGongBean, 上一道工序).compareTo(BigDecimal.ZERO) == 1) {
                            BigDecimal 上一道工序报工数量 = baoGongMapper.get上一道工序报工数量(queryBaoGongBean, 上一道工序);
                            BigDecimal 累计报工数 = baoGongMapper.get累计报工数(queryBaoGongBean, baoGong.get加工顺序());
                            baoGong.set可报数量(上一道工序报工数量.subtract(累计报工数));
                        } else {
                            baoGong.set可报数量(BigDecimal.ZERO);
                        }
                    } else {
                        //无上道工序，查询本工序完成了多少
                        if (baoGongMapper.get本工序订单数量(queryBaoGongBean, baoGong.get物料编号()) != null && baoGongMapper.get本工序订单数量(queryBaoGongBean, baoGong.get物料编号()).size() > 0) {
                            baoGong.set订单数量(baoGongMapper.get本工序订单数量(queryBaoGongBean, baoGong.get物料编号()).get(0));
                            if (baoGongMapper.get已报工数(queryBaoGongBean, baoGong.get加工顺序()) != null && !baoGongMapper.get已报工数(queryBaoGongBean, baoGong.get加工顺序()).equals("")) {
                                BigDecimal 累计报工数 = baoGongMapper.get已报工数(queryBaoGongBean, baoGong.get加工顺序());
                                if ((baoGong.get订单数量().subtract(累计报工数)).compareTo(BigDecimal.ZERO) == -1) {
                                    baoGong.set可报数量(BigDecimal.ZERO);

                                } else {
                                    baoGong.set可报数量(baoGong.get订单数量().subtract(累计报工数));
                                }
                            }
                        }
                    }
                } else {
                    //无上道工序，查询本工序完成了多少
                    if ((baoGongMapper.get本工序订单数量(queryBaoGongBean, baoGong.get物料编号()) != null && baoGongMapper.get本工序订单数量(queryBaoGongBean, baoGong.get物料编号()).size() > 0)) {
                        BigDecimal 订单数量 = baoGongMapper.get本工序订单数量(queryBaoGongBean, baoGong.get物料编号()).get(0);
                        if (baoGongMapper.get已报工数(queryBaoGongBean, baoGong.get加工顺序()) != null && !baoGongMapper.get已报工数(queryBaoGongBean, baoGong.get加工顺序()).equals("")) {
                            BigDecimal 累计报工数 = baoGongMapper.get已报工数(queryBaoGongBean, baoGong.get加工顺序());
                            if ((baoGong.get订单数量().subtract(累计报工数)).compareTo(BigDecimal.ZERO) == -1) {
                                baoGong.set可报数量(BigDecimal.ZERO);
                            } else {
                                baoGong.set可报数量(baoGong.get订单数量().subtract(累计报工数));
                            }
                        }
                    }
                }
                httpData.setCode(0);
                httpData.setData(baoGong);
                logger.info("baogong:" + baoGong.toString());
                //System.out.println("baoGongResponse----" + baoGong.toString());
                return httpData;
            } else {
                httpData.setCode(1);
                httpData.setMsg("本订单不包含此工序");
                return httpData;
            }
        }
    }

    @ResponseBody
    @RequestMapping(value = "insertGX")
    public HttpData<BGResponseBean> getBaoGong(@RequestBody InsertBaoGong insertBaoGong) throws InterruptedException {
        HttpData<BGResponseBean> httpData = new HttpData<>();
        //除成型减脚、成品编带，其它工序同一张单据单一员工号只允许报一次
        if ("成形剪脚".equals(insertBaoGong.getBaoGong().get工序名称()) || "成品编带".equals(insertBaoGong.getBaoGong().get工序名称())) {
            if (insertBaoGong.getBaoGong().get工序单价() != null && !insertBaoGong.getBaoGong().get工序单价().equals("null")) {
                insertBaoGong.getBaoGong().set金额(insertBaoGong.get报工数量().multiply(insertBaoGong.getBaoGong().get工序单价()));
            } else {
                insertBaoGong.getBaoGong().set金额(insertBaoGong.get报工数量().multiply(new BigDecimal(0)));
            }
            insertBaoGong.getBaoGong().set报工工时(new BigDecimal(0));
            insertBaoGong.getBaoGong().set工时单价(new BigDecimal(0));
            insertBaoGong.getBaoGong().set是否工时结算("不按工时结算");
            insertBaoGong.getBaoGong().set是否已经计算("未结算");
            insertBaoGong.getBaoGong().set是否最大顺序("不是最大顺序号");
            insertBaoGong.getBaoGong().set开始时间(new Timestamp(new Date().getTime()));
            insertBaoGong.getBaoGong().set结束时间(new Timestamp(new Date().getTime()));

            //System.out.println("insertBaoGong---" + insertBaoGong.toString());
            logger.info("insertBaoGong:" + insertBaoGong.toString());

            int i = baoGongMapper.insertGX(insertBaoGong);
            if (i > 0) {
                httpData.setCode(0);
            } else {
                httpData.setMsg("报工失败，请联系后台管理员");
            }
        }else {
            int j = baoGongMapper.isInserted(insertBaoGong.getBaoGong().get生产加工单号(),insertBaoGong.getBaoGong().get生产加工单ID(),insertBaoGong.get报工人员(),insertBaoGong.getBaoGong().get工序名称());
            if (j>0){
                httpData.setCode(1);
                httpData.setMsg("该单号您已报过");
            }else {
                if (insertBaoGong.getBaoGong().get工序单价() != null && !insertBaoGong.getBaoGong().get工序单价().equals("null")) {
                    insertBaoGong.getBaoGong().set金额(insertBaoGong.get报工数量().multiply(insertBaoGong.getBaoGong().get工序单价()));
                } else {
                    insertBaoGong.getBaoGong().set金额(insertBaoGong.get报工数量().multiply(new BigDecimal(0)));
                }
                insertBaoGong.getBaoGong().set报工工时(new BigDecimal(0));
                insertBaoGong.getBaoGong().set工时单价(new BigDecimal(0));
                insertBaoGong.getBaoGong().set是否工时结算("不按工时结算");
                insertBaoGong.getBaoGong().set是否已经计算("未结算");
                insertBaoGong.getBaoGong().set是否最大顺序("不是最大顺序号");
                insertBaoGong.getBaoGong().set开始时间(new Timestamp(new Date().getTime()));
                insertBaoGong.getBaoGong().set结束时间(new Timestamp(new Date().getTime()));

                //System.out.println("insertBaoGong---" + insertBaoGong.toString());
                logger.info("insertBaoGong:" + insertBaoGong.toString());

                int i = baoGongMapper.insertGX(insertBaoGong);
                if (i > 0) {
                    httpData.setCode(0);
                } else {
                    httpData.setMsg("报工失败，请联系后台管理员");
                }
            }
        }
        return httpData;
    }
}